package com.sjtu.vfact.textual.cluster;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.sjtu.vfact.textual.model.Cluster;
import com.sjtu.vfact.visualization.base.VfactVertex;

public class FTCClusterer {
	
	public List<Cluster<VfactVertex>> transform(List<VfactVertex> vertices, double threshold, int length){
		List<Cluster<VfactVertex>> list = new ArrayList<Cluster<VfactVertex>>();
		do {
			
			VfactVertex prototype = findPrototype(vertices, length);
			vertices.remove(prototype);
			List<VfactVertex> childs = new ArrayList<VfactVertex>();
			
			if(!vertices.isEmpty()){
				int i = 0;
				do{
					VfactVertex vertex = vertices.get(i);
					if(vertex.isSubsetOf(prototype)){
						childs.add(vertex);
						vertices.remove(i);
					}else{
						int totalSimilarTerms = vertex.getSimilarTerms(prototype).size();
						
						double similarity = (double) totalSimilarTerms / prototype.getSize();
						if(Double.compare(similarity, threshold) >= 0){
							childs.add(vertex);
							vertices.remove(vertex);
						}else{
							i++;
						}
					}
				}while(i < vertices.size());
			}
			
			Cluster<VfactVertex> cluster = new Cluster<VfactVertex>(prototype, childs);
			list.add(cluster);
		} while (vertices.size() > 0);
		
		return list;
	}
	
	private VfactVertex findPrototype(List<VfactVertex> vertices, int length){
		
		if(!vertices.isEmpty()){
			List<VfactVertex> list = new ArrayList<VfactVertex>();
			VfactVertex prototype = null;
			for(VfactVertex vertex : vertices){
				if(vertex.getSize() >= length){
					list.add(vertex);
				}else{
					if(prototype == null){
						prototype = vertex;
					}else{
						if(prototype.getSize() < vertex.getSize()){
							prototype = vertex;
						}
					}
				}
				
			}
			
			if(!list.isEmpty()){
				Random generator = new Random();
				int index = generator.nextInt(list.size());
				
				return list.get(index);	
			}else{
				return prototype;
			}
			
		}
		
		return null;
	}
	
//	public List<Cluster<Number>> transform(Graph<Number, Number> graph, double threshold){
//		List<Cluster<Number>> list = new ArrayList<Cluster<Number>>();
//		List<Number> termsets = new ArrayList<Number>(graph.getVertices());
//		int c = 1;
//		do {
//			
//			Number prototype = findPrototype(termsets);
//			termsets.remove(prototype);
//			List<Number> childs = new ArrayList<Number>();
//			
//			int i = 0;
//			do{
//				Number ts = termsets.get(i);
//				if(c == 1){
//					if(ts.intValue() % 3 == 0){
//						childs.add(ts);
//						termsets.remove(ts);
//					}else{
//						i++;
//					}
//				}else if(c == 2){
//					if(ts.intValue() % 2 == 0){
//						childs.add(ts);
//						termsets.remove(ts);
//					}else{
//						i++;
//					}
//				}else{
//					if(ts.intValue() % 2 == 1){
//						childs.add(ts);
//						termsets.remove(ts);
//					}else{
//						i++;
//					}
//				}
				
//				if(ts.isSubsetOf(prototype)){
//					childs.add(ts);
//					termsets.remove(i);
//				}else{
//					int totalSimilarTerms = ts.getSimilarTerms(prototype).size();
//					
//					double similarity = (double) totalSimilarTerms / prototype.getSize();
//					if(Double.compare(similarity, threshold) >= 0){
//						childs.add(ts);
//						termsets.remove(ts);
//					}else{
//						i++;
//					}
//				}
//			}while(i < termsets.size());
//			c++;
//			Cluster<Number> cluster = new Cluster<Number>(prototype, childs);
//			list.add(cluster);
//		} while (termsets.size() > 0);
//		
//		return list;
//	}
	
//	private Number findPrototype(List<Number> termsets){
//		if(!termsets.isEmpty()){
//			Number prototype = termsets.get(0);
//			for(Number ts : termsets){
//				if(ts.intValue() > prototype.intValue()){
//					prototype = ts;
//				}
//			}
//			return prototype;
//		}
//		
//		return null;
//	}
	
}
